package dao.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.implementations.DBBase;
import dao.interfaces.ICuentaUsuario;
import dao.transferObjects.UsuarioTO;
import dao.transferObjects.UsuarioUnificadoTO;
import dao.transferObjects.Administrador.AdministradorTO;
import dao.transferObjects.Docente.DocenteTO;
import dao.transferObjects.Gae.AlumnoTO;
import dao.transferObjects.Gae.GaeTO;
import dao.transferObjects.Socio.DireccionTO;
import dao.transferObjects.Socio.SocioTO;

public class CuentaUsuarioDB extends DBBase implements ICuentaUsuario
{
	private static String CAMPOSFIJOS1 = " rut, verificador, contrasena, tipo, tipo_fono, fono, correo, eliminado, nombre, apellido ";
	
	private static String CAMPOSFIJOS2 = " rut, verificador, contrasena, tipo, tipo_fono, fono, correo, eliminado, nombre_socio, nombre_encargado, apellido_encargado, descripcion, ciudad, comuna, poblacion ";
	
	private static String USUARIO_ADMIN = " rut, verificador, contrasena, tipo, eliminado, "+
										  " nombre, apellido, correo, tipo_fono, fono, eliminado_admin ";
	
	private static String USUARIO_DOC = " rut, verificador, contrasena, tipo, eliminado, "+
	  									" nombre, apellido, correo, tipo_fono, fono, eliminado_doc ";
	
	private static String USUARIO_SOC = " rut, verificador, contrasena, tipo, eliminado, "+
										" nombre_socio, descripcion, nombre_encargado, apellido_encargado, "+
										" tipo_fono, fono, correo, eliminado_soc, "+
										" region, ciudad, comuna, poblacion, calle, numero ";
	
	private static String USUARIO_GAE = " rut, verificador, contrasena, tipo, eliminado, " +
										" id_gae, rut_gae, nombre_gae, id_proyecto, id_curso, "+
    									" cantidad_alumnos, nombre_representante, apellido_representante, "+
									    " tipo_fono, fono, correo, nota1, nota2, nota3, nota_socio, nota_final, "+
									    " eliminado_gae, matricula_representante ";
	
	//ESTE METODO PRETENDE SER GENERICO PARA CUALQUIER TIPO DE USUARIO
	//YA SEA ADMINISTRADOR, DOCENTE, SOCIO y GAE
	private UsuarioUnificadoTO resultSet_a_UsuarioUnificadoTO(ResultSet rs, String tipoUsuario)
	{
		UsuarioUnificadoTO usuarioUnido = new UsuarioUnificadoTO();
		
		UsuarioTO usr = new UsuarioTO();
		AdministradorTO admin = new AdministradorTO();
		DocenteTO doc = new DocenteTO();
		SocioTO soc = new SocioTO();
		DireccionTO dir = new DireccionTO();
		GaeTO gae = new GaeTO();
		
		try
		{
			
			usr.setRut(rs.getInt("rut"));
			usr.setVerificador(rs.getString("verificador"));
			usr.setContrasena(rs.getString("contrasena"));
			usr.setTipo(rs.getString("tipo"));
			usr.setEliminado(rs.getBoolean("eliminado"));
			
			usuarioUnido.setUsuario(usr);
			
			if(tipoUsuario.equals("administrador"))
			{				
				admin.setUsuario(usr);
				admin.setNombre(rs.getString("nombre"));
				admin.setApellido(rs.getString("apellido"));
				admin.setCorreo(rs.getString("correo"));
				admin.setTipo_fono(rs.getString("tipo_fono"));
				admin.setFono(rs.getInt("fono"));
				admin.setRut_admin(rs.getInt("rut"));
				admin.setEliminado(rs.getBoolean("eliminado_admin"));
				
				usuarioUnido.setAdministrador(admin);
			}
			if(tipoUsuario.equals("docente"))
			{				
				doc.setUsuario(usr);
				doc.setNombre(rs.getString("nombre"));
				doc.setApellido(rs.getString("apellido"));
				doc.setCorreo(rs.getString("correo"));
				doc.setTipo_fono(rs.getString("tipo_fono"));
				doc.setFono(rs.getInt("fono"));
				doc.setRut_docente(rs.getInt("rut"));
				doc.setEliminado(rs.getBoolean("eliminado_doc"));
				
				usuarioUnido.setDocente(doc);				
			}
			if(tipoUsuario.equals("socio"))
			{
				soc.setUsuario(usr);
				soc.setNombre(rs.getString("nombre_socio"));
				soc.setDescripcion(rs.getString("descripcion"));
				soc.setNombreEncargado(rs.getString("nombre_encargado"));
				soc.setApellidoEncargado(rs.getString("apellido_encargado"));
				soc.setTipo_fono(rs.getString("tipo_fono"));
				soc.setFono(rs.getInt("fono"));
				soc.setCorreo(rs.getString("correo"));
				soc.setRut_socio(rs.getInt("rut"));
				soc.setEliminado(rs.getBoolean("eliminado_soc"));
				
				usuarioUnido.setSocio(soc);
				
				dir.setRut_socio(rs.getInt("rut"));
				dir.setRegion(rs.getString("region"));
				dir.setCiudad(rs.getString("ciudad"));
				dir.setComuna(rs.getString("comuna"));
				dir.setPoblacion(rs.getString("poblacion"));
				dir.setCalle(rs.getString("calle"));
				dir.setNumero(rs.getString("numero"));
				usuarioUnido.getSocio().setDireccion(dir);
				//usuarioUnido.socio.setDireccion(dir);
			}
			if(tipoUsuario.equals("gae"))
			{
				gae.setUsuario(usr);
				gae.setId_gae(rs.getInt("id_gae"));
				gae.setRut_gae(rs.getInt("rut_gae"));
				gae.setNombre_gae(rs.getString("nombre_gae"));
				gae.setId_proyecto(rs.getInt("id_proyecto"));
				gae.setId_curso(rs.getInt("id_curso"));
				gae.setCtd_alumno(rs.getInt("cantidad_alumnos"));
				gae.setNombreRepresentante(rs.getString("nombre_representante"));
				gae.setApellidoRepresentante(rs.getString("apellido_representante"));
				gae.setTipo_fono(rs.getString("tipo_fono"));
				gae.setFono(rs.getInt("fono"));
				gae.setCorreo(rs.getString("correo"));
				gae.setNota1(rs.getDouble("nota1"));
				gae.setNota2(rs.getDouble("nota2"));
				gae.setNota3(rs.getDouble("nota3"));
				gae.setNota_socio(rs.getDouble("nota_socio"));
				gae.setNota_final(rs.getDouble("nota_final"));
				gae.setEliminado(rs.getBoolean("eliminado_gae"));
				gae.setMatriculaRepresentante(rs.getInt("matricula_representante"));
				
				usuarioUnido.setGae(gae);
			}
			
		}
		catch (SQLException e){
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> resultSet_a_UsuarioUnificadoTO : " + e.getMessage());
		}
		return usuarioUnido;
	}
	
	//ESTE METODO ES SOLO VALIDO PARA DOCENTES Y ADMINISTRADORES
	private UsuarioUnificadoTO resultSetAUsuarioUnificadoTO(ResultSet rs)
	{
		UsuarioUnificadoTO usuarioUnido = new UsuarioUnificadoTO();
		
		try
		{
			usuarioUnido.setRut(rs.getInt("rut"));
			usuarioUnido.setVerificador(rs.getString("verificador"));
			usuarioUnido.setContrasena(rs.getString("contrasena"));
			usuarioUnido.setTipo(rs.getString("tipo"));
			usuarioUnido.setTipo_fono(rs.getString("tipo_fono"));
			usuarioUnido.setFono(rs.getInt("fono"));
			usuarioUnido.setCorreo(rs.getString("correo"));
			usuarioUnido.setNombre(rs.getString("nombre"));
			usuarioUnido.setApellido(rs.getString("apellido"));
			usuarioUnido.setEliminado(rs.getBoolean("eliminado"));			
		}
		catch (SQLException e){
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> resultSetAUsuarioUnificadoTO : " + e.getMessage());
		}
		return usuarioUnido;
	}
	private UsuarioUnificadoTO resultSetAUsuarioUnificadoTOSocio(ResultSet rs)
	{
		UsuarioUnificadoTO usuarioUnido = new UsuarioUnificadoTO();
		
		try
		{
			usuarioUnido.setRut(rs.getInt("rut"));
			usuarioUnido.setVerificador(rs.getString("verificador"));
			usuarioUnido.setContrasena(rs.getString("contrasena"));
			usuarioUnido.setTipo(rs.getString("tipo"));
			usuarioUnido.setTipo_fono(rs.getString("tipo_fono"));
			usuarioUnido.setFono(rs.getInt("fono"));
			usuarioUnido.setCorreo(rs.getString("correo"));
			usuarioUnido.setNombre(rs.getString("nombre_socio"));
			usuarioUnido.setNombreEncargado(rs.getString("nombre_encargado"));
			usuarioUnido.setApellidoEncargado(rs.getString("apellido_encargado"));
			usuarioUnido.setDescripcion(rs.getString("descripcion"));
			usuarioUnido.setEliminado(rs.getBoolean("eliminado"));
			usuarioUnido.setCiudad(rs.getString("ciudad"));
			usuarioUnido.setComuna(rs.getString("comuna"));
			usuarioUnido.setDireccion(rs.getString("poblacion"));
		}
		catch (SQLException e){
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> resultSetAUsuarioUnificadoTO : " + e.getMessage());
		}
		return usuarioUnido;
	}
	
	public CuentaUsuarioDB(Connection connection)
	{
		this.conn = connection;
	}
	
	@Override
	public int crearUsuarioAdmin(AdministradorTO admin) {
		
		PreparedStatement insertAdmin = null;
		int result = -1;
		
		String query =  "INSERT INTO administrador( "+
	            		"rut_admin, nombre, apellido, correo, tipo_fono, fono, eliminado_admin) "+
						"VALUES (?, ?, ?, ?, ?, ?, ?);";
		
		try{			
			insertAdmin = this.conn.prepareStatement(query);			
			insertAdmin.setInt(1, admin.getRut_admin());
			insertAdmin.setString(2, admin.getNombre());
			insertAdmin.setString(3, admin.getApellido());
			insertAdmin.setString(4, admin.getCorreo());
			insertAdmin.setString(5, admin.getTipo_fono());
			insertAdmin.setInt(6, admin.getFono());
			insertAdmin.setBoolean(7, admin.getEliminado());
			result = insertAdmin.executeUpdate();
			insertAdmin.close();
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase CuentaUsuarioDB -> crearUsuarioAdmin -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public int crearUsuarioDocente(DocenteTO docente) {
		PreparedStatement insertDoc = null;
		int result = -1;
		
		String query =  " INSERT INTO docente( "+
	            	    " rut_docente, nombre, apellido, correo, tipo_fono, fono, eliminado_doc) "+
	            	    " VALUES (?, ?, ?, ?, ?, ?, ?);";
		
		try{			
			insertDoc = this.conn.prepareStatement(query);			
			insertDoc.setInt(1, docente.getRut_docente());
			insertDoc.setString(2, docente.getNombre());
			insertDoc.setString(3, docente.getApellido());
			insertDoc.setString(4, docente.getCorreo());
			insertDoc.setString(5, docente.getTipo_fono());
			insertDoc.setInt(6, docente.getFono());
			insertDoc.setBoolean(7, docente.getEliminado());
			result = insertDoc.executeUpdate();
			insertDoc.close();
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase CuentaUsuarioDB -> crearUsuarioDocente -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public int crearUsuarioSocio(SocioTO socio){
		PreparedStatement insertSoc = null;
		int result = -1;
		
		String query = " INSERT INTO socio( "+
	            	   " rut_socio, nombre_socio, descripcion, nombre_encargado, apellido_encargado, tipo_fono, fono, correo, eliminado_soc) "+
	            	   " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";
		
		try{			
			insertSoc = this.conn.prepareStatement(query);
			insertSoc.setInt(1, socio.getRut_socio());
			insertSoc.setString(2, socio.getNombre());
			insertSoc.setString(3, socio.getDescripcion());
			insertSoc.setString(4, socio.getNombreEncargado());
			insertSoc.setString(5, socio.getApellidoEncargado());
			insertSoc.setString(6, socio.getTipo_fono());
			insertSoc.setInt(7, socio.getFono());
			insertSoc.setString(8, socio.getCorreo());
			insertSoc.setBoolean(9, socio.getEliminado());
			result = insertSoc.executeUpdate();
			insertSoc.close();			
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase CuentaUsuarioDB -> crearUsuarioSocio -> "+ ex.getMessage());
		}		
		return result;
	}
	
	@Override
	public int crearDireccionSocio(SocioTO socio, DireccionTO direccion){
		PreparedStatement insertSoc = null;
		int result = -1;

		String query = " INSERT INTO direccion( "+
				 	   " rut_socio, region, ciudad, comuna, poblacion, calle, numero) "+
				 	   " VALUES (?, ?, ?, ?, ?, ?, ?);";
		
		try{		
			insertSoc = this.conn.prepareStatement(query);				
			insertSoc.setInt(1, direccion.getRut_socio());
			insertSoc.setString(2, direccion.getRegion());
			insertSoc.setString(3, direccion.getCiudad());
			insertSoc.setString(4, direccion.getComuna());
			insertSoc.setString(5, direccion.getPoblacion());
			insertSoc.setString(6, direccion.getCalle());
			insertSoc.setString(7, direccion.getNumero());
			result = insertSoc.executeUpdate();
			insertSoc.close();
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase CuentaUsuarioDB -> crearDireccionSocio -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public int crearUsuarioGae(GaeTO gae, UsuarioTO usuario, List<AlumnoTO> array_alumnos) {
		return 0;
	}

	@Override
	public int modificarUsuarioAdmin(AdministradorTO admin) {
		PreparedStatement updateUser = null;
		int result = -1;
		
		String query = " UPDATE administrador "+
					   " SET nombre=?, apellido=?, correo=?, tipo_fono=?, fono=?, eliminado_admin=? "+
					   " WHERE rut_admin=?;";
		
		try{
			updateUser = this.conn.prepareStatement(query);
			updateUser.setString(1, admin.getNombre());
			updateUser.setString(2, admin.getApellido());
			updateUser.setString(3, admin.getCorreo());
			updateUser.setString(4, admin.getTipo_fono());
			updateUser.setInt(5, admin.getFono());
			updateUser.setBoolean(6, admin.getEliminado());
			updateUser.setInt(7, admin.getRut_admin());
			result = updateUser.executeUpdate();
			updateUser.close();
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase CuentaUsuarioDB -> modificarUsuarioAdmin -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public int modificarUsuarioDocente(DocenteTO docente) {
		PreparedStatement updateUser = null;
		int result = -1;
		
		String query = " UPDATE docente "+
					   " SET nombre=?, apellido=?, correo=?, tipo_fono=?, fono=?, eliminado_doc=? "+
					   " WHERE rut_docente=?;";
		
		try{
			updateUser = this.conn.prepareStatement(query);
			updateUser.setString(1, docente.getNombre());
			updateUser.setString(2, docente.getApellido());
			updateUser.setString(3, docente.getCorreo());
			updateUser.setString(4, docente.getTipo_fono());
			updateUser.setInt(5, docente.getFono());
			updateUser.setBoolean(6, docente.getEliminado());
			updateUser.setInt(7, docente.getRut_docente());
			result = updateUser.executeUpdate();
			updateUser.close();
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase CuentaUsuarioDB -> modificarUsuarioDocente -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public int modificarUsuarioSocio(SocioTO socio) {
		PreparedStatement updateUser = null;
		int result = -1;
		
		String query = " UPDATE socio "+
					   " SET nombre_socio=?, descripcion=?, nombre_encargado=?, "+
					   " apellido_encargado=?, fono=?, correo=?, eliminado_soc=?, tipo_fono=? "+
					   " WHERE rut_socio=?;";
		
		try{
			updateUser = this.conn.prepareStatement(query);
			updateUser.setString(1, socio.getNombre());
			updateUser.setString(2, socio.getDescripcion());
			updateUser.setString(3, socio.getNombreEncargado());
			updateUser.setString(4, socio.getApellidoEncargado());
			updateUser.setInt(5, socio.getFono());
			updateUser.setString(6, socio.getCorreo());
			updateUser.setBoolean(7, socio.getEliminado());
			updateUser.setString(8, socio.getTipo_fono());
			updateUser.setInt(9, socio.getRut_socio());
			result = updateUser.executeUpdate();
			updateUser.close();
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase CuentaUsuarioDB -> modificarUsuarioDocente -> "+ ex.getMessage());
		}		
		return result;
	}
	
	@Override
	public int modificarDireccionSocio(SocioTO socio, DireccionTO direccion){
		PreparedStatement updateUser = null;
		int result = -1;
		
		String query = " UPDATE direccion "+
					   " SET ciudad=?, comuna=?, poblacion=? "+
					   " WHERE rut_socio=?;";
		try{			
			updateUser = this.conn.prepareStatement(query);				
			updateUser.setString(1, direccion.getCiudad());
			updateUser.setString(2, direccion.getComuna());
			updateUser.setString(3, direccion.getPoblacion());
			updateUser.setInt(4, direccion.getRut_socio());				
			result = updateUser.executeUpdate();
			updateUser.close();
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase CuentaUsuarioDB -> modificarDireccionSocio -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public int modificarUsuarioGae(GaeTO gae) {
		return 0;
	}

	@Override
	public int eliminarUsuarioAdmin(AdministradorTO admin) {
		return 0;
	}

	@Override
	public int eliminarUsuarioDocente(DocenteTO docente) {
		return 0;
	}

	@Override
	public int eliminarUsuarioSocio(SocioTO socio) {
		return 0;
	}

	@Override
	public int eliminarUsuarioGae(GaeTO gae) {
		return 0;
	}
	
	@Override
	public UsuarioUnificadoTO obtenerUsuarioAdmin(int rut) {
		return null;
	}
	@Override
	public UsuarioUnificadoTO obtenerUsuarioDocente(int rut) {
		return null;
	}
	@Override
	public UsuarioUnificadoTO obtenerUsuarioSocio(int rut) {
		
		UsuarioUnificadoTO usuariosUnido = new UsuarioUnificadoTO();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String querySocio = " SELECT " + CAMPOSFIJOS2 +
	  						" From usuario u " + 
						  	" left outer join socio as s on u.rut = s.rut_socio " +
						  	" left outer join direccion as d on u.rut = d.rut_socio " +
							" where rut = ?";
		
		try
		{
			pstmt = conn.prepareStatement(querySocio);
			pstmt.setInt(1, rut);
			rs = pstmt.executeQuery();
			while(rs.next()){				
				usuariosUnido = this.resultSetAUsuarioUnificadoTOSocio(rs);
			}
			rs.close();
			pstmt.close();
			
		}catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerUsuarioSocio : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		
		return usuariosUnido;
	}
	@Override
	public GaeTO obtenerUsuarioGae(GaeTO gae) {
		return null;
	}
	@Override
	public List<AdministradorTO> obtenerTodosUsuarioAdmin() {
		return null;
	}
	@Override
	public List<DocenteTO> obtenerTodosUsuarioDocente() {
		return null;
	}
	@Override
	public List<UsuarioUnificadoTO> obtenerTodosUsuarioSocio() {
		
		List<UsuarioUnificadoTO> usuariosUnidos = new ArrayList<UsuarioUnificadoTO>();

		String querySoc = " SELECT " + USUARIO_SOC +
						  " From usuario u " +
						  " left outer join socio as s on u.rut = s.rut_socio " +
						  " left outer join direccion as d on u.rut = d.rut_socio " +
						  " where tipo = 'socio comunitario' ";
		
		PreparedStatement pstmt = null;
		
		ResultSet rs = null;				
		
		try
		{
			pstmt = conn.prepareStatement(querySoc);			
			rs = pstmt.executeQuery();
			while(rs.next()){				
				usuariosUnidos.add(this.resultSet_a_UsuarioUnificadoTO(rs,"socio"));
			}
			rs.close();
		}
		catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerTodosUsuarioSocio : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		
		return usuariosUnidos;
	}
	@Override
	public List<GaeTO> obtenerTodosUsuarioGae() {
		return null;
	}
	
	public List<UsuarioUnificadoTO> obtenerTodosUsuarioUnidicadoTO()
	{
		List<UsuarioUnificadoTO> usuariosUnidos = new ArrayList<UsuarioUnificadoTO>();
		
		String queryAdmin = " SELECT " + USUARIO_ADMIN +
							" FROM usuario as u, administrador as a " +
							" WHERE u.rut = a.rut_admin ";

		String queryDoc = " SELECT " + USUARIO_DOC +
						  " FROM usuario as u, docente as d " +
						  " WHERE u.rut = d.rut_docente ";

		String querySoc = " SELECT " + USUARIO_SOC +
						  " From usuario u " +
						  " left outer join socio as s on u.rut = s.rut_socio " +
						  " left outer join direccion as d on u.rut = d.rut_socio " +
						  " where tipo = 'socio comunitario' ";

		String queryGae = " SELECT " + USUARIO_GAE +
						  " FROM usuario as u, gae as g " +
						  " WHERE u.rut = g.rut_gae ";
		
		PreparedStatement pstmt = null;
		
		ResultSet rs = null;				
		
		try
		{
			//Ingresando cuentas tipo admin
			pstmt = conn.prepareStatement(queryAdmin);			
			rs = pstmt.executeQuery();
			while(rs.next()){				
				usuariosUnidos.add(this.resultSet_a_UsuarioUnificadoTO(rs,"administrador"));
			}
			rs.close();
			pstmt.close();
			//Ingresando cuentas tipo docente
			pstmt = conn.prepareStatement(queryDoc);			
			rs = pstmt.executeQuery();
			while(rs.next()){				
				usuariosUnidos.add(this.resultSet_a_UsuarioUnificadoTO(rs,"docente"));
			}
			rs.close();
			pstmt.close();
			//Ingresando cuentas tipo socio
			pstmt = conn.prepareStatement(querySoc);			
			rs = pstmt.executeQuery();
			while(rs.next()){				
				usuariosUnidos.add(this.resultSet_a_UsuarioUnificadoTO(rs,"socio"));
			}
			rs.close();
			pstmt.close();
			//Ingresando cuentas tipo gae
//			pstmt = conn.prepareStatement(queryGae);			
//			rs = pstmt.executeQuery();
//			while(rs.next()){				
//				usuariosUnidos.add(this.resultSet_a_UsuarioUnificadoTO(rs,"gae"));
//			}
//			rs.close();
//			pstmt.close();
		}
		catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerTodosUsuarioUnidicadoTO : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		
		return usuariosUnidos;
	}
	
	public UsuarioUnificadoTO obtenerUsuarioLogeado(int rutUsuario, String tipoUsuario)
	{
		UsuarioUnificadoTO usuarioUnificado = new UsuarioUnificadoTO();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String queryAdmin = " SELECT " + USUARIO_ADMIN +
							" FROM usuario as u, administrador as a " +
							" WHERE u.rut = a.rut_admin AND u.rut = ? ";
		
		String queryDoc = " SELECT " + USUARIO_DOC +
						  " FROM usuario as u, docente as d " +
						  " WHERE u.rut = d.rut_docente AND u.rut = ? ";
		
		String querySoc = " SELECT " + USUARIO_SOC +
						  " From usuario u " +
						  " left outer join socio as s on u.rut = s.rut_socio " +
						  " left outer join direccion as d on u.rut = d.rut_socio " +
						  " where tipo = 'socio comunitario' and u.rut = ? ";
		
		String queryGae = " SELECT " + USUARIO_GAE +
						  " FROM usuario as u, gae as g " +
						  " WHERE u.rut = g.rut_gae AND u.rut = ? ";
		try
		{
			pstmt = conn.prepareStatement(queryAdmin);
			
			if(tipoUsuario.equals("administrador")){
				pstmt = conn.prepareStatement(queryAdmin);
			}
			else{
				if(tipoUsuario.equals("docente")){
					pstmt = conn.prepareStatement(queryDoc);
				}
				else{
					if(tipoUsuario.equals("socio")){
						pstmt = conn.prepareStatement(querySoc);
					}
					else{
						if(tipoUsuario.equals("gae")){
							pstmt = conn.prepareStatement(queryGae);
						}
					}
				}
			}
			
			pstmt.setInt(1, rutUsuario);
			rs = pstmt.executeQuery();
			while(rs.next()){				
				usuarioUnificado = resultSet_a_UsuarioUnificadoTO(rs, tipoUsuario);
			}
			rs.close();
			pstmt.close();
			
		}catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerUsuarioLogeado : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		
		return usuarioUnificado;
	}

}
